package top.v5it.logback.push.convergence;

import cn.hutool.json.JSONUtil;
import top.v5it.logback.push.Message;
import top.v5it.logback.push.channel.LogInfo;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.Optional;

/**
 * 信息收敛策略，永远等待下条消息到来才触发并计算是否推送消息
 *
 * @author zhanpu
 * @date 2022/9/8
 */
public interface ConvergenceStrategy {

    /**
     * 获取1970-01-01T00:00:00Z至今的秒数
     *
     * @return
     */
    static long toEpochSecond() {
        return LocalDateTime.now(ZoneId.systemDefault()).toEpochSecond(ZoneOffset.of("+8"));
    }

    /**
     * 是否推送
     *
     * @param payload 消息体
     * @return true-推送，false-不推送
     */
    boolean isPush(byte[] payload);

    /**
     * 从消息本中获取消息编号
     *
     * @param payload 消息体
     * @return
     */
    default Optional<String> getMsgId(byte[] payload) {
        return Optional
                .of(new String(payload))
                .filter(JSONUtil::isTypeJSON)
                .map(JSONUtil::parseObj)
                .map(t -> t.toBean(LogInfo.class))
                .map(LogInfo::getMessage)
                .map(Message::getId);
    }
}
